package edu.tfh.s2.ehkbot.steuerung;

import edu.tfh.s2.ehkbot.daten.Protokoll;

/**
 * Richtung abstrahiert eine Richtungsangabe.
 * 
 * @author s2zehn
 */
public class Richtung implements Cloneable {
	private double richtung;

	public Richtung(double richtung) {
		this.richtung = reduziere(richtung);
	}

	/**
	 * Addiert auf die Richtung eine andere Richtung.
	 * 
	 * @param rhs
	 *            Die andere Richtung.
	 * @return Die zwei Addierten Richtungen.
	 */
	public Richtung add(Richtung rhs) {
		this.richtung = reduziere(this.richtung + rhs.richtung);
		return this;
	}

	/**
	 * @see java.lang.Object#clone()
	 */
	@Override
	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			Protokoll.getInstanc().exception(e);
		}
		return null;
	}

	/**
	 * Gibt die Richtung zurück in Grad.
	 * 
	 * @return Die Richtung[°]
	 */
	public double getAlsDeg() {
		return richtung / Math.PI * 180;
	}

	/**
	 * Gibt die Richtung zurück in Radiant
	 * 
	 * @return Die Richtung [rad]
	 */
	public double getAlsRad() {
		return richtung;
	}

	/**
	 * Negiert die Richtung.
	 * 
	 * @return
	 */
	public Richtung neg() {
		this.richtung = this.richtung * -1;
		return this;
	}

	/**
	 * Reduziert die Richtung auf 0-360° bzw. 0-2Pi
	 * 
	 * @param gradRad
	 *            Die Richtung in als Radiant.
	 * @return Die Reduzierte Richtung.
	 */
	public double reduziere(double gradRad) {
		return gradRad - (2 * Math.PI * Math.floor(gradRad / (2 * Math.PI)));
	}

	/**
	 * Subtahiert die Richtung von einander.
	 * 
	 * @param rhs
	 *            Die andere Richtung.
	 * @return Die Subtrahierten Richtungen.
	 */
	public Richtung sub(Richtung rhs) {
		this.richtung = reduziere(this.richtung - rhs.richtung);
		return this;
	}
}
